/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import java.util.ArrayList;

/**
 *
 * @author Admin
 */
public class RangoIntercuartilico extends MedicionesEstadisticasDecorator {

    private MedicionesEstadisticas estadisticas;
    
    public RangoIntercuartilico(MedicionesEstadisticas est){
        this.estadisticas = est;
        this.setDatos(est.getDatos());
    }
    
    @Override
    public double Calcular() {
        ArrayList<Double> cuartiles = Cuartiles(estadisticas.getDatos());
        return cuartiles.get(2) - cuartiles.get(0);
    }
    
    private ArrayList<Double> Cuartiles(ArrayList<Double> datos) {
        if (datos.size() < 3) {
            System.out.println("No se pueden tener menos de 3 elementos");
        }

        double mediana = estadisticas.Calcular();

        ArrayList<Double> mitadInferior = SepararValoresMasPequenos(datos, mediana, true);
        ArrayList<Double> mitadSuperior = SepararValoresMasGrandes(datos, mediana, true);

        ArrayList<Double> resultado = new ArrayList<Double>();
        estadisticas.setDatos(mitadInferior);
        MedicionesEstadisticas est = new Mediana(estadisticas);        
        resultado.add(est.Calcular());
        resultado.add(mediana);
        estadisticas.setDatos(mitadSuperior);
        est = new Mediana(estadisticas);
        resultado.add(est.Calcular());

        return resultado;
    }
    
    private static ArrayList<Double> SepararValoresMasGrandes(ArrayList<Double> datos, double limite, boolean conIguales) {
        ArrayList<Double> nuevosDatos = new ArrayList<Double>();

        for (double valor : datos) {
            if (valor > limite || (valor == limite && conIguales)) {
                nuevosDatos.add(valor);
            }
        }

        return nuevosDatos;
    }

    private static ArrayList<Double> SepararValoresMasPequenos(ArrayList<Double> datos, double limite, boolean conIguales) {
        ArrayList<Double> nuevosDatos = new ArrayList<Double>();

        for (double valor : datos) {
            if (valor < limite || (valor == limite && conIguales)) {
                nuevosDatos.add(valor);
            }
        }

        return nuevosDatos;
    }    
}
